Java Technologies Custom Scope তৈরি করা গাইড ও নোট

222

Guice-এ Custom Scope তৈরি করা মানে এমন একটি scope তৈরি করা যা আপনার প্রয়োজন অনুযায়ী ডিপেনডেন্সির লাইফসাইকেল কন্ট্রোল করতে পারে। Guice-এ ডিফল্টরূপে কিছু স্কোপ যেমন @Singleton বা @Session রয়েছে, কিন্তু আপনি যদি আপনার নির্দিষ্ট প্রয়োজনের জন্য একটি কাস্টম স্কোপ তৈরি করতে চান, তবে Guice তা সহজেই সাপোর্ট করে।

Custom Scope ব্যবহার করলে আপনি ডিপেনডেন্সির ইনস্ট্যান্স সুরক্ষিত করতে পারেন, যাতে সেই ইনস্ট্যান্স একটি নির্দিষ্ট কনটেক্সট বা অবস্থায় (যেমন, থ্রেড, HTTP রিকোয়েস্ট, অথবা অন্য কোন অবস্থান) জীবিত থাকে।

এখানে Custom Scope তৈরি করার প্রক্রিয়া এবং উদাহরণ দেওয়া হলো।


Custom Scope তৈরি করার প্রক্রিয়া

  1. Scope Interface তৈরি করুন: Guice-এ স্কোপ তৈরি করতে আপনাকে একটি কাস্টম স্কোপ ইন্টারফেস তৈরি করতে হবে যা Scope ক্লাসকে ইমপ্লিমেন্ট করবে।
  2. Scope ম্যানেজমেন্ট (Scope Context) তৈরি করুন: Scope কন্টেক্সট ম্যানেজ করার জন্য একটি ক্লাস তৈরি করুন, যেখানে ডিপেনডেন্সির ইনস্ট্যান্স সঞ্চিত থাকবে।
  3. Guice Module-এ কাস্টম স্কোপ যুক্ত করুন: Guice Module-এ আপনি bindScope মেথড ব্যবহার করে কাস্টম স্কোপটি নির্ধারণ করবেন।

Custom Scope উদাহরণ

ধরা যাক, আমরা একটি কাস্টম স্কোপ তৈরি করতে চাই যা একটি নির্দিষ্ট থ্রেডে ডিপেনডেন্সির ইনস্ট্যান্স সাপোর্ট করবে (থ্রেড-স্কোপড ইনজেকশন)।

১. Custom Scope Interface তৈরি করা

প্রথমে একটি ThreadScope নামের কাস্টম স্কোপ ক্লাস তৈরি করুন যা Guice এর Scope ইন্টারফেস ইমপ্লিমেন্ট করবে।

import com.google.inject.Scope;
import com.google.inject.Inject;
import com.google.inject.Key;
import com.google.inject.Provider;
import com.google.inject.Singleton;

import java.util.HashMap;
import java.util.Map;

public class ThreadScope implements Scope {

    private static final ThreadLocal<Map<Key<?>, Object>> threadLocalStorage = ThreadLocal.withInitial(HashMap::new);

    @Override
    public <T> Provider<T> scope(Key<T> key, Provider<T> unscoped) {
        return () -> {
            Map<Key<?>, Object> map = threadLocalStorage.get();

            // যদি ইতোমধ্যে ইনস্ট্যান্স থ্রেডে উপস্থিত থাকে তবে তা ফেরত দিন
            if (map.containsKey(key)) {
                return (T) map.get(key);
            }

            // নইলে, নতুন ইনস্ট্যান্স তৈরি করুন এবং তা থ্রেডে সংরক্ষণ করুন
            T instance = unscoped.get();
            map.put(key, instance);
            return instance;
        };
    }

    public static void clear() {
        threadLocalStorage.remove();
    }
}

এই ক্লাসটি থ্রেডস্পেসিফিক স্টোরেজ ব্যবহার করে Provider-এর মাধ্যমে ডিপেনডেন্সি প্রদান করবে। যদি সেই থ্রেডে পূর্বে কোনও ইনস্ট্যান্স সংরক্ষিত থাকে, তবে সেই ইনস্ট্যান্সটি প্রদান করা হবে, নইলে নতুন ইনস্ট্যান্স তৈরি করা হবে এবং সেটি সেই থ্রেডে সংরক্ষণ করা হবে।

২. Module-এ কাস্টম স্কোপ কনফিগার করা

এখন আপনাকে Guice এর Module এ এই স্কোপটি কনফিগার করতে হবে। এটি করার জন্য bindScope মেথড ব্যবহার করতে হবে।

import com.google.inject.AbstractModule;

public class AppModule extends AbstractModule {
    @Override
    protected void configure() {
        // ThreadScope ব্যবহার করা হচ্ছে
        bindScope(ThreadScoped.class, new ThreadScope());
    }
}

৩. Custom Scope অ্যানোটেশন তৈরি করা

Guice-এ স্কোপ কাস্টমাইজ করতে আপনি একটি অ্যানোটেশন তৈরি করতে পারেন। উদাহরণস্বরূপ, ThreadScoped নামের একটি অ্যানোটেশন তৈরি করুন।

import com.google.inject.BindingAnnotation;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@BindingAnnotation
@Retention(RetentionPolicy.RUNTIME)
public @interface ThreadScoped {
}

৪. ক্লাসে কাস্টম স্কোপ ব্যবহার করা

এখন আমরা ThreadScoped অ্যানোটেশন ব্যবহার করে আমাদের Service ক্লাসকে কাস্টম স্কোপে যুক্ত করব।

@ThreadScoped
public class ThreadScopedService implements Service {
    private final String id;

    public ThreadScopedService() {
        this.id = "Service instance for Thread: " + Thread.currentThread().getId();
    }

    @Override
    public void serve() {
        System.out.println(id);
    }
}

৫. Guice Injector এবং থ্রেডে ডিপেনডেন্সি ইনজেকশন করা

import com.google.inject.Guice;
import com.google.inject.Injector;

public class Main {
    public static void main(String[] args) {
        Injector injector = Guice.createInjector(new AppModule());

        // একটি থ্রেডে ডিপেনডেন্সি ইনজেক্ট করা
        Runnable task = () -> {
            Service service = injector.getInstance(Service.class);
            service.serve();
        };

        // দুইটি থ্রেডে টাস্ক রান করানো
        Thread thread1 = new Thread(task);
        Thread thread2 = new Thread(task);

        thread1.start();
        thread2.start();
    }
}

এখানে, প্রতিটি থ্রেড তার নিজস্ব ThreadScopedService ইনস্ট্যান্স পাবে। যদি দুটি থ্রেড একই Service কনফিগারেশন ব্যবহার করে, তবে তাদের জন্য আলাদা ইনস্ট্যান্স তৈরি হবে।


Guice-এ Custom Scope তৈরি করা Java-তে ডিপেনডেন্সি ইনজেকশনকে আরো ফ্লেক্সিবল এবং কাস্টমাইজেবল করে তোলে। আপনি বিভিন্ন ধরনের স্কোপ তৈরি করতে পারেন যেমন থ্রেড-বেসড, রিকোয়েস্ট-বেসড, এবং আরও অনেক কিছু।

এই উদাহরণে, আমরা থ্রেড-স্পেসিফিক স্কোপ তৈরি করেছি যা প্রতিটি থ্রেডে আলাদা ডিপেনডেন্সি ইনস্ট্যান্স ইনজেক্ট করতে সক্ষম। Guice কাস্টম স্কোপের মাধ্যমে ডিপেনডেন্সি ইনজেকশনকে আরও শক্তিশালী এবং অ্যাডভান্সড তৈরি করা সম্ভব।

Content added By
Promotion

Are you sure to start over?

Loading...